package logica_de_negocio;

import java.util.HashSet;

import logica_de_datos.GestorBD;
import comun.ValoracionPelicula;

public class gestorValoracionPelicula {

	private HashSet<ValoracionPelicula> gvp;
	final GestorBD objConversor = GestorBD.getInstance();

	public gestorValoracionPelicula() {
		gvp = new HashSet<ValoracionPelicula>();
	}

	public void cargarDatos() {

		try {
			objConversor.connect();
			gvp = objConversor.listarValoracionPelicula();
			objConversor.disconnect();
		} catch (ClassNotFoundException e) {
		}
	}

	/**
	 * 
	 * @param valorPel
	 * @throws excepAnadirDupli
	 * @throws FaltanDatosEnLaBaseDeDatos
	 * @throws ClassNotFoundException
	 *             Se produce cuando no existe la base de datos
	 */
	public void addValoracionPelicula(ValoracionPelicula valorPel)
			throws excepAnadirDupli, FaltanDatosEnLaBaseDeDatos,
			ClassNotFoundException {
		cargarDatos();
		if (gvp.contains(valorPel)) {
			excepAnadirDupli dupli = new excepAnadirDupli();
			dupli.setDes("La pelicula con id " + valorPel.getId_p()
					+ "  ya esta valorada");
			throw dupli;
		} else {
			comprovarvalorPel(valorPel);
			objConversor.connect();
			objConversor.addValoracionPelicula(valorPel);
			objConversor.disconnect();

		}
	}

	/**
	 * 
	 * @param valorPel
	 * @throws FaltanDatosEnLaBaseDeDatos
	 * @throws ClassNotFoundException
	 *             Se produce cuando no existe la base de datos
	 */
	private void comprovarvalorPel(ValoracionPelicula valorPel)
			throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {

		/**
		 * Comprueba que tanto en id del usuario como el del capitulo esten en
		 * la base de datos
		 */

		boolean estaP = false;
		gestorPeli gp = new gestorPeli();
		if (gp.isId(valorPel.getId_p())) {
			estaP = true;
		}
		boolean estaU = false;
		gestorUsuario gu = new gestorUsuario();
		if (gu.isId(valorPel.getId_u())) {
			estaU = true;
		}
		if ((estaP == false) || (estaU == false)) {
			FaltanDatosEnLaBaseDeDatos ex = new FaltanDatosEnLaBaseDeDatos();
			if (estaP == false) {
				ex.setFalta("Falta el id de la pelicula ");
			}
			if ((estaU == false) && (estaP == false)) {
				ex.setFalta(ex.getFalta() + " y ");
			}
			if (estaU == false) {
				if (ex.getFalta() == null) {
					ex.setFalta("Falta el id del usuario ");
				} else {
					ex.setFalta(ex.getFalta() + "falta el id del usuario ");
				}

			}
			ex.setFalta(ex.getFalta() + "en la Base De datos");
			throw ex;
		}
	}

	public boolean modificarValoracionPelicula(ValoracionPelicula valorPel)
			throws ClassNotFoundException {

		cargarDatos();
		boolean dev = false;
		if (gvp.contains(valorPel)) {

			objConversor.connect();
			objConversor.modifyValoracionPelicula(valorPel);
			dev = true;
			objConversor.disconnect();

		}
		return dev;
	}

	public boolean deleteValoracionPelicula(ValoracionPelicula valorPel)
			throws ClassNotFoundException {

		cargarDatos();
		boolean dev = false;
		if (gvp.contains(valorPel)) {
			objConversor.connect();
			objConversor.deleteValoracionPelicula(valorPel);
			dev = true;
			objConversor.disconnect();

		}
		return dev;
	}

	public boolean deleteAllValoracionPeliculaFromId_U(int id_u)
			throws ClassNotFoundException {

		cargarDatos();
		boolean dev = false;
		for (ValoracionPelicula valorPel : gvp) {

			if (valorPel.getId_u() == id_u) {

				objConversor.connect();
				objConversor.deleteValoracionPelicula(valorPel);
				dev = true;
				objConversor.disconnect();

			}
		}
		return dev;
	}

	public boolean deleteAllValoracionPeliculaFromId_P(int id_p)
			throws ClassNotFoundException {

		cargarDatos();
		boolean dev = false;
		for (ValoracionPelicula valorPel : gvp) {

			if (valorPel.getId_p() == id_p) {

				objConversor.connect();
				objConversor.deleteValoracionPelicula(valorPel);
				dev = true;
				objConversor.disconnect();

			}
		}
		return dev;
	}

	public boolean isVal(ValoracionPelicula vp) {
		cargarDatos();
		boolean dev = false;
		dev = gvp.contains(vp);
		return dev;
	}

	public boolean isId_p(int id_p) {

		boolean dev = false;

		cargarDatos();

		for (ValoracionPelicula vp : gvp) {

			if (vp.getId_p() == id_p) {
				dev = true;
			}
		}
		return dev;
	}

	public boolean isId_u(int id_u) {
		boolean dev = false;

		cargarDatos();

		for (ValoracionPelicula vp : gvp) {

			if (vp.getId_u() == id_u) {
				dev = true;
			}
		}
		return dev;
	}

	public ValoracionPelicula getValoracionPelicula(int id_u, int id_p) {
		cargarDatos();
		ValoracionPelicula dev = null;
		for (ValoracionPelicula vp : gvp) {
			if (vp.getId_p() == id_p) {
				if (vp.getId_u() == id_u) {
					dev = vp;
				}
			}
		}
		return dev;
	}

	/**
	 * Ontener todas las peliculas valoradas por un usuario dado su id.
	 * 
	 * @param id_u
	 *            id del usuario del cual seamos obtener las valoraciones
	 *            realizadas
	 * @return Devuelve un HashSet con todos los id de los capitulos valorados
	 * @throws FaltanDatosEnLaBaseDeDatos
	 * @throws ClassNotFoundException
	 *             Error que se lanza cuando no existe la base de datos.
	 */
	public HashSet<Integer> getValoradas(int id_u)
			throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {

		boolean Valoro = isId_u(id_u);
		HashSet<Integer> idPelis = new HashSet<Integer>();
		if (Valoro) {
			objConversor.connect();
			idPelis = objConversor.id_pValoracionPelicula(id_u);
			objConversor.disconnect();

		} else {
			FaltanDatosEnLaBaseDeDatos f = new FaltanDatosEnLaBaseDeDatos();
			f.setFalta("Este usuario no ha valorado nada");
			throw f;
		}
		return idPelis;
	}

	/**
	 * Nos indica si hay alguna valoracion guargada en la base de datos.
	 * 
	 * @return Cuando no existen valoraciones devuelve un true y false en caso
	 *         contrario.
	 */
	public boolean estaVacia() {
		boolean dev = false;
		cargarDatos();
		dev = gvp.isEmpty();
		return dev;
	}

	/**
	 * Obtener de la base de datos todas las valoraciones de una pelicula dada
	 * su id de pelicula
	 * 
	 * @param id_p
	 *            -> Id de la pelicula que se desea obtener las valoraciones.
	 * @return HashSet con las Valoraciones realizadas sobre una pelicula como
	 *         obj,ValoracionPelicula
	 * @throws FaltanDatosEnLaBaseDeDatos
	 *             Se produce cuando nadie a valorado esa pelicual.
	 */
	public HashSet<ValoracionPelicula> getValoradasPel(int id_p)
			throws FaltanDatosEnLaBaseDeDatos {
		boolean Valorada = isId_p(id_p);
		HashSet<ValoracionPelicula> idPelis = new HashSet<ValoracionPelicula>();
		if (Valorada) {
			try {
				objConversor.connect();
				idPelis = objConversor.ValoracionPeliculaDeId_p(id_p);
				objConversor.disconnect();
			} catch (ClassNotFoundException e) {
			}
		} else {
			FaltanDatosEnLaBaseDeDatos f = new FaltanDatosEnLaBaseDeDatos();
			f.setFalta("Esta pelicula no ha sido valorada");
			throw f;
		}
		return idPelis;
	}
}